class Person(object):
    age_range = [0, 120]
    gender_range = ["男", "女"]

    def __init__(self, name, age, gender):
        self.__name = name  # 私有属性，不能通过 对象.name 来访问或修改
        self.__age = age  # 被保护的属性，口头约定，可以通过 对象.age 来访问或修改,推荐
        self.__gender = gender

    def _show(self):  # __show()则会被隐藏，直接调用 mia.__show() 会报错
        print(self.__dict__)  # self.__dict__ 可以访问 _ 和 __ 的所有属性和方法
        print(dir(self))  # 打印对象的所有属性和方法，列表 [' ', ' ', ... ]

    @property  # 把 get()方法封装成属性 get,调用时 name 即可，而不是 name() 获取 姓名
    def name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    @property
    def gender(self):
        return self.__gender

    @name.setter  # 变量修改器
    def name(self, name):
        self.__name = name

    @age.setter
    def age(self, age):
        if Person.age_range[0] < age < Person.age_range[1]:
            self.__age = age
        else:
            raise Exception("年龄异常")

    @gender.setter
    def gender(self, gender):
        if gender in Person.gender_range:
            self.__gender = gender
        else:
            raise Exception("性别异常")

    def __str__(self):
        return str(self.__dict__)

    def __add__(self, other):
        return self.__name + other.__name

    def __eq__(self, other):
        return self.__name == other.__name


mia = Person("mia", 25, "女")
print(mia.gender)
mia.name = "王欣淼"
mia._show()
print(mia.__str__())
print(mia)
print(mia.__eq__(Person("mia", 10, "男")))
